package com.njupt.webapp.tags;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
import org.apache.taglibs.standard.tag.common.core.NullAttributeException;

public class TagUtils {
	private final static Log log = LogFactory.getLog(TagUtils.class);
	/**
	 * 解析el。
	 * @param attributeName 属性名，只是报错的时候用得着。
	 * @param expression el的表达式。
	 * @param expectedType 结果类型。
	 * @param tag 所属tag。
	 * @param pageContext 查找范围。
	 * @return
	 * @throws JspException
	 */
    public static Object evaluate(String attributeName,String expression,
            Class expectedType,Tag tag, PageContext pageContext)
            throws JspException {
    	Object value;
    	try {//这里是使用的ExpressionEvaluatorManager，这是standard.jar(现在在jstl-1.2.jar里了)里的内容。
    			value = ExpressionEvaluatorManager.evaluate(
                    attributeName, expression, expectedType, tag, pageContext);
    	} catch (NullAttributeException ex) {
    	    // explicitly allow 'null' for value
    	    value = null;
    	}
    	return value;
    }
    public static void saveToContext(TagSupport tag,PageContext pageContext,String scope,Object obj){
        String name = tag.getId();
    	if (scope != null) {
            if (scope.equals("page")) {
                pageContext.setAttribute(name, obj);
            } else if (scope.equals("request")) {
                pageContext.getRequest().setAttribute(name, obj);
            } else if (scope.equals("session")) {
                pageContext.getSession().setAttribute(name, obj);
            } else if (scope.equals("application")) {
                pageContext.getServletContext().setAttribute(name, obj);
            } else {
                throw new RuntimeException("Attribute 'scope' must be: page, request, session or application :"+scope);
            }
        }else{
        	pageContext.getRequest().setAttribute(name, obj);
        }
    }
}
